home *** CD-ROM | disk | FTP | other *** search
/ Kit PC World De Ampliacion De Windows 95 / Kit PC World de ampliacion de Windows 95.iso / internet / sweeper / samples / olecon~1 / controls / template / templctl.cpp < prev    next >
Text File  |  1995-11-25  |  12KB  |  397 lines

  1. //=--------------------------------------------------------------------------=
  2. // <<DEFCONTROLTRUNCNAME>>Ctl.Cpp
  3. //=--------------------------------------------------------------------------=
  4. // Copyright  1995  Microsoft Corporation.  All Rights Reserved.
  5. //
  6. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  7. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  8. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  9. // PARTICULAR PURPOSE.
  10. //=--------------------------------------------------------------------------=
  11. //
  12. //
  13. //
  14. #include "IPServer.H"
  15.  
  16. #include "Guids.H"
  17. #include "<<DEFCONTROLTRUNCNAME>>Ctl.H"
  18. #include "LocalObj.H"
  19. #include "Util.H"
  20. #include "Globals.H"
  21. #include "Resource.H"
  22.  
  23. // for ASSERT and FAIL
  24. //
  25. SZTHISFILE
  26.  
  27.  
  28. //=--------------------------------------------------------------------------=
  29. // all the events in this control
  30. //
  31. // TODO: add events here ...
  32. //
  33.  
  34. //=--------------------------------------------------------------------------=
  35. // array describing all of our property pages.  these clsids are typically
  36. // in guids.h
  37. //
  38. // TODO: add any additional property page guids here ...
  39. //
  40. const GUID *rg<<DEFCONTROLNAME>>PropPages [] = {
  41.     &CLSID_<<DEFCONTROLNAME>>GeneralPage
  42. };
  43.  
  44. //=--------------------------------------------------------------------------=
  45. // Custum Verb information
  46. //
  47. // TODO: add any custom verbs here in an array, using the VERBINFO structure.
  48. //       then mark the controld def'n in <<DEFCONTROLTRUNCNAME>>Ctl.H with
  49. //       this verb array
  50. //
  51.  
  52.  
  53. //=--------------------------------------------------------------------------=
  54. // C<<DEFCONTROLNAME>>Control::Create
  55. //=--------------------------------------------------------------------------=
  56. // global static function that creates an instance of the control an returns
  57. // an IUnknown pointer for it.
  58. //
  59. // Parameters:
  60. //    IUnknown *        - [in] controlling unknown for aggregation
  61. //
  62. // Output:
  63. //    IUnknown *        - new object.
  64. //
  65. // Notes:
  66. //
  67. IUnknown *C<<DEFCONTROLNAME>>Control::Create
  68. (
  69.     IUnknown *pUnkOuter
  70. )
  71. {
  72.     // make sure we return the private unknown so that we support aggegation
  73.     // correctly!
  74.     //
  75.     C<<DEFCONTROLNAME>>Control *pNew = new C<<DEFCONTROLNAME>>Control(pUnkOuter);
  76.     return pNew->PrivateUnknown();
  77. }
  78.  
  79. //=--------------------------------------------------------------------------=
  80. // C<<DEFCONTROLNAME>>Control::C<<DEFCONTROLNAME>>Control
  81. //=--------------------------------------------------------------------------=
  82. // "Being born is like being kidnapped.  And then sold into slavery."
  83. //    - andy warhol (1928 - 87)
  84. //
  85. // Parameters:
  86. //    IUnknown *        - [in]
  87. //
  88. // Notes:
  89. //
  90. #pragma warning(disable:4355)  // using 'this' in constructor
  91. C<<DEFCONTROLNAME>>Control::C<<DEFCONTROLNAME>>Control
  92. (
  93.     IUnknown *pUnkOuter
  94. )
  95. : COleControl(pUnkOuter, OBJECT_TYPE_CTL<<DEFCONTROLNAMECAPS>>, (IDispatch *)this)
  96. {
  97.     // initialize anything here ...
  98.     //
  99.     memset(&m_state, 0, sizeof(<<DEFCONTROLNAMECAPS>>CTLSTATE));
  100.  
  101.     // TODO: initialize anything you need to here.
  102.  
  103. }
  104. #pragma warning(default:4355)  // using 'this' in constructor
  105.  
  106. //=--------------------------------------------------------------------------=
  107. // C<<DEFCONTROLNAME>>Control::~C<<DEFCONTROLNAME>>Control
  108. //=--------------------------------------------------------------------------=
  109. // "We all labour against our own cure, for death is the cure of all diseases"
  110. //    - Sir Thomas Browne (1605 - 82)
  111. //
  112. // Notes:
  113. //
  114. C<<DEFCONTROLNAME>>Control::~C<<DEFCONTROLNAME>>Control ()
  115. {
  116.     // TODO: clean up anything here.
  117. }
  118.  
  119. //=--------------------------------------------------------------------------=
  120. // C<<DEFCONTROLNAME>>Control:RegisterClassData
  121. //=--------------------------------------------------------------------------=
  122. // register the window class information for your control here.
  123. // this information will automatically get cleaned up for you on DLL shutdown.
  124. //
  125. // Output:
  126. //    BOOL            - FALSE means fatal error.
  127. //
  128. // Notes:
  129. //
  130. BOOL C<<DEFCONTROLNAME>>Control::RegisterClassData
  131. (
  132.     void
  133. )
  134. {
  135.     WNDCLASS wndclass;
  136.  
  137.     // TODO: register any additional information you find interesting here.
  138.     //       this method is only called once for each type of control
  139.     //
  140.     memset(&wndclass, 0, sizeof(WNDCLASS));
  141.     wndclass.style          = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
  142.     wndclass.lpfnWndProc    = COleControl::ControlWindowProc;
  143.     wndclass.hInstance      = g_hInstance;
  144.     wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  145.     wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
  146.     wndclass.lpszClassName  = WNDCLASSNAMEOFCONTROL(OBJECT_TYPE_CTL<<DEFCONTROLNAMECAPS>>);
  147.  
  148.     return RegisterClass(&wndclass);
  149. }
  150.  
  151. //=--------------------------------------------------------------------------=
  152. // C<<DEFCONTROLNAME>>Control::BeforeCreateWindow
  153. //=--------------------------------------------------------------------------=
  154. // called just before the window is created.  Great place to set up the
  155. // window title, etc, so that they're passed in to the call to CreateWindowEx.
  156. // speeds things up slightly.
  157. //
  158. // Notes:
  159. //
  160. void C<<DEFCONTROLNAME>>Control::BeforeCreateWindow
  161. (
  162.     void
  163. )
  164. {
  165.     // TODO: users should modify m_dwWindowStyle, m_dwWindowStyleEx, m_szWindowTitle
  166.     // et al here so that the call to createwindow has as much information as
  167.     // possible.
  168.     // if you don't use this function, then you can probably just remove it.
  169. }
  170.  
  171. //=--------------------------------------------------------------------------=
  172. // C<<DEFCONTROLNAME>>Control::InternalQueryInterface
  173. //=--------------------------------------------------------------------------=
  174. // qi for things only we support.
  175. //
  176. // Parameters:
  177. // Parameters:
  178. //    REFIID        - [in]  interface they want
  179. //    void **       - [out] where they want to put the resulting object ptr.
  180. //
  181. // Output:
  182. //    HRESULT       - S_OK, E_NOINTERFACE
  183. //
  184. // Notes:
  185. //
  186. HRESULT C<<DEFCONTROLNAME>>Control::InternalQueryInterface
  187. (
  188.     REFIID  riid,
  189.     void  **ppvObjOut
  190. )
  191. {
  192.     IUnknown *pUnk;
  193.  
  194.     *ppvObjOut = NULL;
  195.  
  196.     // TODO: if you want to support any additional interrfaces, then you should
  197.     // indicate that here.  never forget to call COleControl's version in the
  198.     // case where you don't support the given interface.
  199.     //
  200.     if (DO_GUIDS_MATCH(riid, IID_I<<DEFCONTROLNAME>>)) {
  201.         pUnk = (IUnknown *)(I<<DEFCONTROLNAME>> *)this;
  202.     } else{
  203.         return COleControl::InternalQueryInterface(riid, ppvObjOut);
  204.     }
  205.  
  206.     pUnk->AddRef();
  207.     *ppvObjOut = (void *)pUnk;
  208.     return S_OK;
  209. }
  210.  
  211. //=--------------------------------------------------------------------------=
  212. // C<<DEFCONTROLNAME>>Control::LoadTextState
  213. //=--------------------------------------------------------------------------=
  214. // load in our text state for this control.
  215. //
  216. // Parameters:
  217. //    IPropertyBag *        - [in] property bag to read from
  218. //    IErrorLog *           - [in] errorlog object to use with proeprty bag
  219. //
  220. // Output:
  221. //    HRESULT
  222. //
  223. // Notes:
  224. //    - NOTE: if you have a binary object, then you should pass an unknown
  225. //      pointer to the property bag, and it will QI it for IPersistStream, and
  226. //      get said object to do a Load()
  227. //
  228. STDMETHODIMP C<<DEFCONTROLNAME>>Control::LoadTextState
  229. (
  230.     IPropertyBag *pPropertyBag,
  231.     IErrorLog    *pErrorLog
  232. )
  233. {
  234.     // TODO: implement your text load code here.
  235.     //
  236.     return S_OK;
  237. }
  238.  
  239. //=--------------------------------------------------------------------------=
  240. // C<<DEFCONTROLNAME>>Control::LoadBinaryState
  241. //=--------------------------------------------------------------------------=
  242. // loads in our binary state using streams.
  243. //
  244. // Parameters:
  245. //    IStream *            - [in] stream to write to.
  246. //
  247. // Output:
  248. //    HRESULT
  249. //
  250. // Notes:
  251. //
  252. STDMETHODIMP C<<DEFCONTROLNAME>>Control::LoadBinaryState
  253. (
  254.     IStream *pStream
  255. )
  256. {
  257.     // TODO: implement your binary load code here.  to prevent this from being
  258.     // a massive performance sink, you should probably try to organize your
  259.     // properties in such a way that enables you to do just one IStream::Read
  260.     // in the LoadBinaryState function.  fast is good.
  261.     //
  262.     return S_OK;
  263. }
  264.  
  265. //=--------------------------------------------------------------------------=
  266. // C<<DEFCONTROLNAME>>Control::SaveTextState
  267. //=--------------------------------------------------------------------------=
  268. // saves out the text state for this control using a property bag.
  269. //
  270. // Parameters:
  271. //    IPropertyBag *        - [in] the property bag with which to work.
  272. //    BOOL                  - [in] if TRUE, then write out ALL properties, even
  273. //                            if they're their the default value ...
  274. //
  275. // Output:
  276. //    HRESULT
  277. //
  278. // Notes:
  279. //
  280. STDMETHODIMP C<<DEFCONTROLNAME>>Control::SaveTextState
  281. (
  282.     IPropertyBag *pPropertyBag,
  283.     BOOL          fWriteDefaults
  284. )
  285. {
  286.     // TODO: implement your text save code here.
  287.     //
  288.     return S_OK;
  289. }
  290.  
  291. //=--------------------------------------------------------------------------=
  292. // C<<DEFCONTROLNAME>>Control::SaveBinaryState
  293. //=--------------------------------------------------------------------------=
  294. // save out the binary state for this control, using the given IStream object.
  295. //
  296. // Parameters:
  297. //    IStream  *             - [in] save to which you should save.
  298. //
  299. // Output:
  300. //    HRESULT
  301. //
  302. // Notes:
  303. //    - it is important that you seek to the end of where you saved your
  304. //      properties when you're done with the IStream.
  305. //
  306. STDMETHODIMP C<<DEFCONTROLNAME>>Control::SaveBinaryState
  307. (
  308.     IStream *pStream
  309. )
  310. {
  311.     // TODO: implement your binary save state code here.  to prevent this from being
  312.     // a massive performance sink, you should probably try to organize your
  313.     // properties in such a way that enables you to do just one IStream::Read
  314.     // in the LoadBinaryState function.  fast is good.
  315.     //
  316.     return S_OK;
  317. }
  318.  
  319.  
  320. //=--------------------------------------------------------------------------=
  321. // C<<DEFCONTROLNAME>>Control::OnDraw
  322. //=--------------------------------------------------------------------------=
  323. // "I don't very much enjoy looking at paintings in general.  i know too
  324. //  much about them.  i take them apart."
  325. //    - georgia o'keeffe (1887-1986)
  326. //
  327. // Parameters:
  328. //    HDC                - [in]  HDC to draw to
  329. //    LPCRECTL           - [in]  rect we're drawing to
  330. //    LPCRECTL           - [in]  window extent and origin for meta-files
  331. //    HDC                - [in]  HIC for target device
  332. //
  333. // Output:
  334. //    HRESULT
  335. //
  336. // Notes:
  337. //
  338. HRESULT C<<DEFCONTROLNAME>>Control::OnDraw
  339. (
  340.     HDC      hdcDraw,
  341.     LPCRECTL prcBounds,
  342.     LPCRECTL prcWBounds,
  343.     HDC      hicTargetDevice
  344. )
  345. {
  346.     // TODO: put your drawing code here ...
  347.     //
  348.     return S_OK;
  349. }
  350.  
  351. //=--------------------------------------------------------------------------=
  352. // C<<DEFCONTROLNAME>>Control::WindowProc
  353. //=--------------------------------------------------------------------------=
  354. // window procedure for this control.  nothing terribly exciting.
  355. //
  356. // Parameters:
  357. //     see win32sdk on window procs.
  358. //
  359. // Notes:
  360. //
  361. LRESULT C<<DEFCONTROLNAME>>Control::WindowProc
  362. (
  363.     HWND   hwnd,
  364.     UINT   msg,
  365.     WPARAM wParam,
  366.     LPARAM lParam
  367. )
  368. {
  369.     // TODO: handle any messages here, like in a normal window
  370.     // proc.  note that for special keys, you'll want to override and
  371.     // implement OnSpecialKey.
  372.     //
  373.     return DefWindowProc(hwnd, msg, wParam, lParam);
  374. }
  375.  
  376. //=--------------------------------------------------------------------------=
  377. // C<<DEFCONTROLNAME>>Control::AboutBox
  378. //=--------------------------------------------------------------------------=
  379. // prints up an about box.  fweeeee.
  380. //
  381. // Notes:
  382. //
  383. void C<<DEFCONTROLNAME>>Control::AboutBox
  384. (
  385.     void
  386. )
  387. {
  388.     // TODO: Ideally, one would use DialogBox, and some sort of Dialog Box here if
  389.     // they wanted a slightly more interesting About Box ...  you should
  390.     // still call ModalDialog first, however.
  391.     //
  392.     ModalDialog(TRUE);
  393.     MessageBox(NULL, "This is My Control", "About <<DEFCONTROLNAME>>", MB_OK | MB_TASKMODAL);
  394.     ModalDialog(FALSE);
  395. }
  396.  
  397.